/*
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct st_ccl circle_list_node;
typedef circle_list_node *pNode;
typedef pNode list;

struct st_ccl
{
    int e;
    pNode next;
};

void move_m_in_n(int n,int m)
{
    list l;
    pNode cell,u;
    int i;
    pNode tmp,x;
    pNode q;

    if(m < 1)
    {
        printf("m should not be less 1.\n");
    }

    // create the list;
    // l = (list)malloc(sizeof(circle_list_node) * n);
    // if(NULL == l)
    // {
    //     printf("memory alloc failed.\n");
    //     return;
    // }

    cell = (pNode)malloc(sizeof(circle_list_node));
    if(NULL == cell)
        return;

    l = cell;           // 得到链表表头

    // ------------------------------------------------------
    u = l;
    l->e = 0;

    for(i = 1;i < n;i++)
    {
        cell = (pNode)malloc(sizeof(circle_list_node));
        if(NULL == cell)
            return;

        cell->e = i;

        u->next = cell;
        u = u->next;

        if(n - 1 == i)
            u->next = l;
    }


    // for(i = 0;i < n - 1;i++)
    // {
    //     l[i].e = i;
    //     l[i].next = &(l[i + 1]);
    // }

    //l[i].e = i;
    //l[i].next = &(l[0]);



    // -----------------
    printf("print the list.\n");
    x = l;
    for(i = 0;i < n;i++)
    {
        printf("%d:\t address:%p\t%d\n",i,x,x->e);
        printf("--------------------next point to:%p\n",x->next);
        x = x->next;
    }

    printf("try to free node.\n");
    // printf("it will free No.5,%p\n",l+5);
    // printf("e = %d,next = %p\n",l[5].e,l[5].next);

    x = l;
    for(i = 0;i < n;i++)
    {
        tmp = x->next;
        printf("check next:%d\t=%p\n",i,x);
        free(x);
        x = tmp;
    }

    // 不能乱用 &(l[3]) --> 它的确等于 &(l+3)
    // &(l[0])只是碰巧没偏移而已
    // 这个问题，我必须解决掉它，它是个老生常谈的鬼问题，我虽然知道，没想到还是中招
    // x = l;

    // for(i = 0;i < n;i++)
    // {
    //     printf("l[%d] address:%p\n",i,x + i);
    // }

    printf("hi.\n");


    // // 单纯尝试删除 l[4];
    // x = &l[3];
    // tmp = x->next;
    // x->next = tmp->next;
    // printf("it will free %p\n",tmp);
    // printf("%d,%p\n",tmp->e,tmp->next);
    // free(tmp);
    // tmp = NULL;

    // x = &(l[0]);
    // for(i = 0;i < n + 1;i++)
    // {
    //     printf("PRINT AGAIN:\taddress:%p\n",x);
    //     x = x->next;
    // }

    // x = &(l[0]);

    // //while(&(l[0]) != (&l[0])->next)
    // for(int j = 0;j < 5;j++)
    // {
    //     for(i = 0;i < m - 1;i++)
    //         x = x->next;

    //     tmp = x->next;
    //     x->next = x->next->next;
    //     printf("move %d\n",x->next->e);
    //     free(tmp);                // 因为是一次分配的关系？

    //     x = x->next;
    // }

    //printf("move %d in [%d],final:%d\n",m,n,l[0].e);
}

// end of file ----------------------------------------------------------------
